/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import React, { useMemo } from 'react';
import { GESTURE_SOURCE } from '../../constants';
import { useGestureHandler, useAdaptiveSheetInternal, useGestureEventsHandlersDefault } from '../../hooks';
import type { AdaptiveSheetGestureHandlersProviderProps } from './types';
import { useSharedValue } from 'react-native-reanimated';
import { AdaptiveSheetGestureHandlersContext } from '../../contexts/gesture';

const AdaptiveSheetGestureHandlersProvider = ({
  gestureEventsHandlersHook: useGestureEventsHandlers = useGestureEventsHandlersDefault,
  children,
}: AdaptiveSheetGestureHandlersProviderProps): JSX.Element => {
  const animatedGestureSource = useSharedValue<GESTURE_SOURCE>(GESTURE_SOURCE.UNDETERMINED);

  const { animatedContentGestureState, animatedHandleGestureState } = useAdaptiveSheetInternal();
  const { handleOnStart, handleOnActive, handleOnEnd } = useGestureEventsHandlers();

  const contentPanGestureHandler = useGestureHandler(
    GESTURE_SOURCE.CONTENT,
    animatedContentGestureState,
    animatedGestureSource,
    handleOnStart,
    handleOnActive,
    handleOnEnd,
  );

  const scrollablePanGestureHandler = useGestureHandler(
    GESTURE_SOURCE.SCROLLABLE,
    animatedContentGestureState,
    animatedGestureSource,
    handleOnStart,
    handleOnActive,
    handleOnEnd,
  );

  const handlePanGestureHandler = useGestureHandler(
    GESTURE_SOURCE.HANDLE,
    animatedHandleGestureState,
    animatedGestureSource,
    handleOnStart,
    handleOnActive,
    handleOnEnd,
  );

  const contextValue = useMemo(
    () => ({
      contentPanGestureHandler,
      handlePanGestureHandler,
      scrollablePanGestureHandler,
      animatedGestureSource,
    }),
    [contentPanGestureHandler, handlePanGestureHandler, scrollablePanGestureHandler, animatedGestureSource],
  );
  return <AdaptiveSheetGestureHandlersContext.Provider value={contextValue}>{children}</AdaptiveSheetGestureHandlersContext.Provider>;
};

export default AdaptiveSheetGestureHandlersProvider;
